package pe.com.rimac.portal.common.config;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.springframework.util.ResourceUtils;
import org.springframework.util.SystemPropertyUtils;

public class ServiceConfig 
{
    private static final String PROPERTY_DEFAULT_VALUE = null;

    private PropertiesConfiguration config = null;

    /**
     * 
     * @param configFile
     */
    public ServiceConfig(String configFile)
    {
        try
        {
            config = new PropertiesConfiguration(resolveAbsolute(configFile));
        }
        catch (ConfigurationException ce)
        {
            throw new RuntimeException("Ocurri\u00F3 un error al cargar el archivo de configuraci\u00F3n '"
                    + configFile + "'", ce);
        }
        catch (FileNotFoundException ce)
        {
            throw new RuntimeException("Ocurri\u00F3 un error al cargar el archivo de configuraci\u00F3n '"
                    + configFile + "'", ce);
        }
    }

    private String resolveAbsolute(String location) throws FileNotFoundException
    {
        String resolvedLocation = SystemPropertyUtils.resolvePlaceholders(location);
        File file = ResourceUtils.getFile(resolvedLocation);
        if (!file.exists())
        {
            throw new FileNotFoundException("Config file '" + resolvedLocation + "' not found");
        }
        return file.getAbsolutePath();
    }

    /**
     * 
     * @param configFiles
     */
    public ServiceConfig(List<String> configFiles)
    {
        config = new PropertiesConfiguration();
        for (Iterator<String> iterator = configFiles.iterator(); iterator.hasNext();)
        {
            String configFile = (String) iterator.next();
            try
            {
                config.load(resolveAbsolute(configFile));
            }
            catch (ConfigurationException ce)
            {
                throw new RuntimeException("Ocurri\u00F3 un error al cargar el archivo de configuraci\u00F3n '"
                        + configFile + "'", ce);
            }
            catch (FileNotFoundException ce)
            {
                throw new RuntimeException("Ocurri\u00F3 un error al cargar el archivo de configuraci\u00F3n '"
                        + configFile + "'", ce);
            }
        }
    }

    /**
     * Retorna el valor de la propiedad especificada. Si no se encuentra un
     * valor se devuelve null.
     * 
     * @param key
     * @return
     */
    public String getProperty(String key)
    {
        return config.getString(key, PROPERTY_DEFAULT_VALUE);
    }

    /**
     * Retorna un array con los valores de la propiedad. Los valores deben estar
     * separados por comas. Si no se encuentran valores se devuelve un array
     * vac&iacute;o.
     * 
     * @param key
     * @return
     */
    public String[] getPropertyArray(String key)
    {
        return config.getStringArray(key);
    }
}